home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / math.swg / 0060_Math Expression Evaluatio.pas < prev    next >
Pascal/Delphi Source File  |  1994-01-27  |  5KB  |  202 lines

  1. unit Eval;
  2. interface
  3.  
  4.   function ExpValue (ExpLine : string; var Error : boolean) : real;
  5.  
  6. implementation
  7.  
  8.   function ExpValue (ExpLine : string; var Error : boolean) : real;
  9.   var
  10.     Index            : integer;
  11.     Ltr              : char;
  12.     NextLtr          : char;
  13.     Token            : char;
  14.     TokenValue       : real;
  15.  
  16.     procedure GetLtr;
  17.     begin {GetLtr}
  18.       Ltr := NextLtr;
  19.       if Index < length (ExpLine) then begin
  20.         Index := succ (Index);
  21.         NextLtr := ExpLine [Index];
  22.       end else begin
  23.         NextLtr := '%';
  24.       end;
  25.     end;
  26.  
  27.     procedure GetToken;
  28.       procedure GetNum;
  29.         var
  30.           Str : string;
  31.           E   : integer;
  32.       begin
  33.         Str := '0'+Ltr; {Avoids problems if first char is '.'}
  34.         while NextLtr in ['0'..'9'] do begin
  35.           GetLtr;
  36.           Str := Str + Ltr;
  37.         end; {while}
  38.         if NextLtr = '.' then begin
  39.           GetLtr;
  40.           Str := Str + Ltr;
  41.           while NextLtr in ['0'..'9'] do begin
  42.             GetLtr;
  43.             Str := Str + Ltr;
  44.           end; {while}
  45.           Str := Str + '0'; {Avoids problems if last char is '.'}
  46.         end;
  47.         val (Str,TokenValue,E);
  48.         Error := E <> 0;
  49.       end;
  50.  
  51.     begin {GetToken}
  52.       GetLtr;
  53.       while Ltr = ' ' do GetLtr;
  54.       if Ltr in ['0'..'9','.'] then begin
  55.         GetNum;
  56.         Token := '#';
  57.       end else begin
  58.         Token := Ltr;
  59.       end;
  60.     end;
  61.  
  62. function Expression : real;
  63.   var
  64.     IExp             : real;
  65.  
  66.     function Term : real;
  67.     var
  68.       ITerm : real;
  69.       TFact : real;
  70.  
  71.       function Factor : real;
  72.       var
  73.         IFact : real;
  74.  
  75.       begin {Factor}
  76.         case Token of
  77.           '(' :
  78.             begin
  79.               GetToken;
  80.               IFact := Expression;
  81.               if Token <> ')' then Error := true;
  82.             end;
  83.           '#' :
  84.             begin
  85.               IFact := TokenValue;
  86.             end;
  87.           else
  88.             Error := true;
  89.         end;
  90.         Factor := IFact;
  91.         GetToken;
  92.       end;
  93.  
  94.     begin {Term}
  95.       if Token = '-' then begin
  96.         GetToken;
  97.         ITerm := -Factor;
  98.       end else begin
  99.         if Token = '+' then begin
  100.           GetToken;
  101.         end;
  102.         ITerm := Factor;
  103.       end;
  104.       if not Error then begin
  105.         while Token in ['*','/'] do begin
  106.           case Token of
  107.             '*' :
  108.               begin
  109.                 GetToken;
  110.                 ITerm := ITerm * Factor;
  111.               end;
  112.             '/' :
  113.               begin
  114.                 GetToken;
  115.                 TFact := Factor;
  116.                 if TFact <> 0 then begin
  117.                   ITerm := ITerm / TFact;
  118.                 end else begin
  119.                   Error := true;
  120.                 end;
  121.               end;
  122.           end; {case}
  123.         end; {while}
  124.       end; {if}
  125.       Term := ITerm;
  126.     end; {Term}
  127.  
  128.   begin {Expression}
  129.     IExp := Term;
  130.     if not Error then begin
  131.       while Token in ['+','-'] do begin
  132.         case Token of
  133.           '+' :
  134.             begin
  135.               GetToken;
  136.               IExp := IExp + Term;
  137.             end;
  138.           '-' :
  139.             begin
  140.               GetToken;
  141.               IExp := IExp - Term;
  142.             end;
  143.         end; {case}
  144.       end; {while}
  145.     end; {if}
  146.     Expression := IExp;
  147.   end; {Expression}
  148.  
  149.   begin {ExpValue};
  150.     Error := false;
  151.     Index := 0;
  152.     NextLtr := ' ';
  153.     GetLtr;
  154.     GetToken;
  155.     if Token = '%' then begin
  156.       ExpValue := 0.0;
  157.     end else begin
  158.       ExpValue := Expression;
  159.       if Token <> '%' then Error := true;
  160.     end;
  161.   end;
  162.  
  163. end.
  164.  
  165. { --------------------------------   DEMO  --------------------- }
  166.  
  167. Program Evaluate;
  168. (* 10/1189  *)
  169. (* Uploaded by Pat Dant  *)
  170. (* Based on the Pascal Unit Eval that allows you to take a string
  171.    and perform a recurssive math function on the string resulting
  172.    in a real answer.
  173.    This Exe version allows the command line argument to be the string
  174.    and will print the answer on the screen at the current cursor position.*)
  175.  
  176. (* ExpValue unit is designed by Don McIver in his very well written program
  177.    SCB Checkbook Program. Currently version 4.2.*)
  178.  
  179. Uses  Dos, Crt, Eval;
  180.  
  181. const
  182.  EvalStrPos           =  1;
  183.  
  184. var
  185.  EvalString           :  string;
  186.  Answer               :  real;
  187.  EvalError            :  Boolean;
  188.  
  189.  begin
  190.    ClrScr;
  191.    Answer := 0;
  192.    EvalError := False;
  193.    Answer := ExpValue(ParamStr(EvalStrPos),EvalError );
  194.    if EvalError then begin
  195.       Writeln('Error in Command Line Format : ',Answer:8:2);
  196.       Halt;
  197.    end;
  198.    Write(Answer:8:2);
  199.  end.
  200.  
  201.  
  202.